#函数function:组织好的，可重复使用的，实现特定功能的代码段。
# 不使用内置函致Len()求，统计子符串的长度，
# str1 ="itheima!"
# str2 ="itcast"
# str3 ="python"
# #定义一个计数的变量
# count =0
# for i in str1:
#     count += 1
# print(f"字符串{str1}的长度是: {count}")
# count =0
# for i in str2:
#     count += 1
# print(f"字符串{str2}的长度是: {count}")
# count =0
# for i in str3:
#      count += 1
# print(f"字符串{str3}的长度是: {count}")
#
# #👆重复性劳动，低效     👇高效省事劳动
# #可以使田函数，来优化这个过程def my_len(data):
# def my_len(data):
#     count = 0
#     for i in data:
#         count += 1
#     print(f"字符串{data}的长度是{count}")
# my_len(str1)
# my_len(str2)
# my_len(str3)
#由上总结出函数的三大特点：1已组织好的 2可重复利用 3针对特定功能👉从而提高程序复用性，减少重复性代码，提高开发效率

# 函数的定义:
# def 函数名(传入参数):
#     函数体
#     return 返回值
#调用函数，让定义的函数开始工作
#函数名（参数）
#
# def cute_pig():
#     print('🐖是世界上最可爱的动物')
#
# #调用函数，让定义的函数开始工作
# cute_pig()

# ❗注意事项
# 参数如不需要，可以省略例如：👆的（）空空的没有参数(后续章节讲解)
# 返回值如不需要，可以省略(后续章节讲解)
# 函数必须先定义（用def）后使用（调用函数）

# def various_check():
#     print("欢迎来到我的世界!")
#     print("请出示你的72h病毒检测证明")
# various_check()

#函数的传入参数
#定义函数
# def add(x,y):#x，y为❗parameter👉定义-形式参数，可多个
#     result=x+y
#     print(f"{x}+{y}的结果是；{result}")
# #调用函数
# add(1,2)#x，y为❗argument👉调用-实际参数

# def various_check(x):
#     print(f"欢迎来到我的世界!请出示你的72h病毒检测证明")
#     if x>37.5:
#         print(f"请出示核酸证明，你的体温是{x},需要隔离")
#     else:
#         print(f"你的体温是{x},正常进入")
# various_check(40)


# #定义一个函数，完成2数相加功能
# def add(a,b):
#     result=a+b
#     # print("我完事了")
# # 通过返回值，将相加的结果返回给调用者
#     return result
# #返回结果后，还想输出一句话
#     # print("我完事了")#但输不出来--原因；由于结果返回了所以后面无论是什么都不会执行
#
# #函数的返回值，可以通过变量去接收
# r = add(5,6)
# print(r)

# 无return语句的函数返回值
# def say_hi():
#     print('hi')
# result=say_hi()
# print(f"无返回值函数，返回的内容是：{result}")
# print(f"无返回值函数，返回的内容类型是：{type(result)}")
#
# #主动返回None的函数
# def say_hi():
#     print('hi')
#     return None
# result=say_hi()
# print(f"无返回值函数，返回的内容是：{result}")
# print(f"无返回值函数，返回的内容类型是：{type(result)}")

#None类型的应用场景
#1.用在函数表示无返回值
#2.用在if判断,None等同于False
#  也会在函数中主动返回None,配合if判断做相关处理
#None用于if判断
# def check_age(age):
#     if age > 18:
#         return "SUCCESS"
#     else:
#         return None
# result = check_age(16)
# if result==None:#也可将result==None写成 not result 二者等价
# #进Aif表示result是None值 也就是FaLse
#     print("未成年，不可以进入")
#3.定义变量,暂时不需要变量有具体值 ,可用None代替
# eg:name=None

#利用函数说明文档
# def add(x,y):
#     """#(通过自己打这三个引号如何一回车,系统会自动将多行注释的格式打出来,
# #          从而进行文档说明,帮助更好理解函数功能,例子如下,这些只是注释)
# #     add函数可进行两数相加的功能
# #     :param x: 形参x表示相加的一个数字
# #     :param y: 形参y表示相加的另一个数字
# #     :return: 返回值是2数相加的结果
# #     """
# #
#     result=x+y
#     print(f"结果是:{result}")
#     return result
# add(5,6)

# #函数--嵌套调用:在一个函数中,调用另一个函数
# 执行过程:函数
# # A中执行到调用函数B的语句,全部将函数B全部执行完以后,继续执行函数A剩余的内容,例子如下:
# def func_A():
#     print("---2---")
# def func_B():
#     print("---1---")
#     func_A()
#     print("---3---")
# #调用func_B
# func_B()
#如果函数B中调用了另一个函数A,
#那么先把函数B中的任务执行完毕之后才会回到上次函数A执行的位置
#变量作用域

#变量类型
# 1.局部变量:作用函数内部,在函数外部无法使用
# #演示局部变量
# def test_a():
#     num=100#👉局部变量
#     print(num)
# test_a()
# print(num)#出了函数体，局部变量num无法使用，so会报错SyntaxError: invalid decimal literal

# 2.全局变量:在函数内外部均可使用
# num=200#👉全局变量
# def test_a():
#     print(f"test_a:{num}")
# def test_b():
#     print(f"test_b:{num}")
# test_a()
# test_b()
# print(num)
#结果：
# test_a:200
# test_b:200
# 200
# 3.如何将函数内定义的变量声明为全局变量
# 利用global关键键字,global变量
# num=200#👉全局变量
# def test_a():
#     print(f"test_a:{num}")
# def test_b():
#     global num#设置内部定义的变量为全局变量
#     num=500#内部定义的变量
#     print(f"test_b:{num}")
# test_a()
# test_b()
# print(num)
# 结果：test_a:200
# test_b:500
# 500

#summary：1。调用函数，倘若内外部都有定义变量那么会调用内部的，内部未定义则用外部定义变量
#2.将变量内变外直接：global 变量。

# review:❗❗return的作用:有返回值-计算并保存
#返回值-就是程序完成事情后,最后给调用者的结果
# # eg:
# def add(a,b):
#     result=a+b
#     return result
# r=add(1,2)#调用者
# print(r)
#
# def add(a,b):
#     result=a+b
#     return result
# print(add(1,2))
#
# def add(a,b):
#     result=a+b
# r=add(1,2)
# print(add(1,2))
#
# #结果:3
# # 3
# # None
# # summary:没有return无法输出结果.
#
#
# #综合案例
#
# money=5000000
# name=None
# name=input('please input your name:')
# #定义查询函数
# def check(x):
#     if x:#❗难点1❗:利用if 判断语句--结合布尔类型的参数x去通过调用函数check_a(输入False/True)
#         # 在后面进行print内容的选择性输出[通过参数x控制内容输出]
#         print("---------查询余额--------------")
#     print(f"{name}你好，您的余额剩余：{money}元")
# #定义存款函数
# def saving(num):
#     global money#通过global将函数内部定义的money变为全局变量
#     money+=num
#     print("----------存款-----------------")
#     print(f"{name}你好，您存款{num}元成功.")
#     #调用check函数查询余额
#     check(False)
# #定义取款函数
# def get_money(num):
#     global money#通过global将函数内部定义的money变为全局变量
#     money-=num
#     print("----------取款-----------------")
#     print(f"{name}你好，您取款{num}元成功.")
#     check(False)
# #定义主菜单函数
# def main():
#     print("---------主菜单--------------")
#     print(f"{name},您好,欢迎来到ATM.请选择操作:")
#     print("查询余额\t[输入1]")#利用制表符\t占据空格进行对齐
#     print("存款\t\t[输入2]")
#     print("取款\t\t[输入3]")
#     print("退出\t\t[输入4]")
#     return input("请输入您的选择:")
# #设置无限循环，确保程序不退出
# while True:
#     y= main()
#     if y =="1":
#         check(True)
# #通过continue继续下一次循环，一进来就是回到了主菜单
#         continue
#     elif y =="2":
#         num = int(input("您想要存多少钱?请输入:"))
#         saving(num)
#         continue
#     elif y == "3":
#         num = int(input("您想要取多少钱?请输入:"))
#         get_money(num)
#         continue
#     else:
#         print("程序退出啦")
#         break
